1、在二叉树中找到两个节点的最近公共祖先
思想：递归查看；就是判断  在根还是在左，还是在右
class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    TreeNode* _lowestCommonAncestor(TreeNode* root, int o1, int o2)
    {
        if(root==nullptr)
            return nullptr;
        if(root->val==o1||root->val==o2)
            return root;
        TreeNode* left=_lowestCommonAncestor(root->left,o1,o2);
        TreeNode* right=_lowestCommonAncestor(root->right,o1,o2);
        if(left&&right)
            return root;
        if(left)
            return left;
        if(right)
            return right;
        return nullptr;
    }
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
         TreeNode* ans=_lowestCommonAncestor(root,o1,o2);
        return ans->val;
    }
};
2、最长回文子串；
思想：双指针做法，往两边扩展
class Solution {
public:
    int getLongestPalindrome(string A, int n) {
        // write code here
        if(n<2)
            return n;
        int ans=0;
        int i=0;
        while(i<n)
        {
            //剩余字符串的长度小于当前求得的最大长度的一半，表示不可能比ans还大了
            if(n-i<ans/2)
                break;
            int left=i;
            int right=i;
            //去重
            while(right<n-1&&A[right+1]==A[right])
                ++right;
            i=right+1;
            //往两边找回文串长度
            while(right<n-1&&left>0&&A[right+1]==A[left-1])
            {
                left--;
                right++;
            }
            if(right-left+1>ans)
                ans=right-left+1;
        }
        return ans;
    }
};
